www.gusucode.com > 小车循迹AVR版 (1) > 小车循迹AVR版 (1)/小车循迹AVR版/2012年4月25日(程序备份--能正常跑完).txt

    /****
**********************************
*程序说明:
*此ATmega128
*包含功能:
*1、
*2、
*3、
*4、
*5、
**********************************
*文件:main.c
*用途:系统主程序
*注意:系统时钟8MHZ
*编译环境:Code VisionAVR
**********************************
*版本:循迹小车v1.0
*作者:吾ARM1
*修改时间?012年4月19日
*完成时间:2012年4月16日
**********************************/ 

#include<mega128.h> 
#include "delay.h"
#define left1   PORTC.0  
#define left2   PORTC.1
#define min     PORTC.2
#define right1  PORTC.3
#define right2  PORTC.4  
#define Turn_Left       PORTC.5
#define Turn_Right      PORTC.6
#define u8      unsigned char 
#define u16     unsigned int  

void  Init_IO(void)
{
    DDRC = DDRC&0xe0; //将C端口低5位定义为输入,浮空
    PORTC = 0xe0;// 
    DDRB = 0xff; //将B端口设为输出模式
    PORTB = 0xff; 
    PORTA = 0xff;
    DDRA = 0xff; 
}   

void Adjust_Speed(u8 Left_Speed,u8 Right_Speed)
{
      OCR1A = (u16)Right_Speed*10 ;//Left_Speed:1--100,为右电机占空比
      OCR1B = (u16)Left_Speed*10;//Right_Speed:1--100,为左电机的占空比    
}
 
void    Init_Timer1(void)
{       u16     i,j;
        i = 300; //实际测试发现1600时电机速度还是很快的。
        j = 300;
        TCCR1A = 0xa0;//相位与频率修正PWM,TOP值为ICR1,向上计数匹配清零,向下计数匹配时置1
        TCCR1B = 0x12;//系统时钟8分频,A,B同时输出PWM   
        OCR1A = i; //右电机
        OCR1B = j;  //在电机
        ICR1 = 1000;
} 

void main(void)
{    
        Init_IO();
        Init_Timer1();
        while(1)
        {
           if(PINC==0xfb)//只有中间循迹管检测到黑线11011
           {
               Adjust_Speed(30,30);//前进  
               PORTA = 0xfe;
           }
           
         if(PINC==0xf9)//中间和左边第二个循迹管检测到黑线10011
         {
               Adjust_Speed(20,60);//左转 
              //  delay_ms(5);
               PORTA = 0xfd;
          }
             
           if(PINC==0xfd)//左边第二个循迹管检测到黑线10111
           {
                Adjust_Speed(15,65);//左转 
               //delay_ms(5);
                 PORTA = 0xfb;
           }
            
           if(PINC==0xfc)//左边两个同时检测到黑线00111
           {
           
                Adjust_Speed(15,70);//左转 
                 PORTA = 0xf7;
           }
           
          if(PINC==0xfe)//左边第一个循迹管检测到黑线01111
          {
              
               Adjust_Speed(15,85);//左转 
             //   delay_ms(5);
                PORTA = 0xef;
          } 
           
            if(PINC==0xf3)//中间和右边第二个循迹管检测到黑线11001
          {
              
               Adjust_Speed(35,15);//右转 
                PORTA = 0xdf;
           } 
          if(PINC==0xf7)//右边第二个循迹管检测到黑线11101
          {
               Adjust_Speed(70,13);//右转  
                PORTA = 0xbf;
           }  
           if(PINC==0xe7)//右边两个检测到黑线11100
           {
               Adjust_Speed(75,13);//右转  
               PORTA = 0x7f; 
           }  
           if(PINC==0xef)//右边第一个检测到黑线11110
           {
               Adjust_Speed(96,12);//右转   
               PORTA = 0xfc;
           }   
           if(PINC==0xe3)//右侧三个循迹管同时检测到黑线(直角)11000
           {
               Adjust_Speed(40,0);//右转 
               PORTA = 0xf8;    
           } 
           if(PINC==0xe7)//左侧三个循迹管同时检测到黑线(直角)00011左转
          {
               Adjust_Speed(0,40);//左转 
                PORTA = 0xf0; 
           }
           if(PINC==0xe0)//5个循迹管同时检测到交叉00000直走
           {
             Adjust_Speed(25,25);//直走 
              PORTA = 0xe0; 
           } 
       //    if(PINC==0xff)
         //  {
           //    Adjust_Speed(0,100);//直走 
             // PORTA = 0xc0;   
           //}
           
        }
        
}